這篇文檢討一下學 Go 這幾天,
今天沒有一個學得很完整的東西可以分享(再加上好累#
想寫一個 concurrent 的 merge sort 一直不順,之後寫好會放回這篇
2021/10/15 更新:merge sort 寫好了,但不知道怎麼去設定 go runtime 的 parallel
看了一個 Coursera 影片,
補了一點點 go concurrency 的東西到 goroutine 那篇。
之後繼續看,希望幫助之後寫 concurrent 的 go 程式時少踩一點坑。
嘗試寫點東西
// 要先 import bufio 和 os
reader := bufio.NewReader(os.Stdin)
// ReadString 吃 byte 所以不能打 "\n"
// 記得放 _ 因為會回傳 error
newinput, _ := reader.ReadString('\n')
failed ^_^
net/http
、log
等,另外就是小 repo 不太會用到 design patterns。
想學好的程式架構設計真的是一條漫漫長路,沒有太多捷徑呢。
這幾天下來,覺得 syntax 熟悉度要多練,可能還是需要更多寫扣的時間。
因為熟悉度不夠,導致看程式碼時,尤其碰到 struct / interface 的地方,常常對於這裡要不要加 {}
各種問號
今天寫 merge sort 傳 array 也卡了
與其急著去瞭解更多的 modules,好像更該練習好基礎,之後才能自己實作呢。
package main
import (
"fmt"
"math/rand"
"time"
)
func Mergesort(arr []int)([]int) {
if len(arr) < 2 {
return arr
}
mid := len(arr) / 2
return merge(Mergesort(arr[:mid]), Mergesort(arr[mid:]))
}
func merge(a1 []int, a2 []int)([]int){
a:=[]int{}
//fmt.Println(a1, a2, len(a1), len(a2))
i, j := 0, 0
for i < len(a1) && j < len(a2) {
if a1[i] <= a2[j] {
a = append(a, a1[i])
i++
} else if a1[i] > a2[j]{
a = append(a, a2[j])
j++
}
}
for i < len(a1) {
a = append(a, a1[i])
i++
}
for j < len(a2) {
a = append(a, a2[j])
j++
}
//fmt.Println("a is ", a)
return a
}
func main() {
arr := []int{}
rand.Seed(time.Now().UnixNano())
// for i := 0; i < 10; i++ {
// arr[i] = rand.Intn(100)
// }
arr = rand.Perm(20)
fmt.Println(arr)
newarr := Mergesort(arr)
fmt.Println(newarr)
}
package main
import (
"fmt"
"math/rand"
"time"
)
func mergesort(arr []int, ch chan []int) {
if len(arr) < 2 {
ch <- arr
return
}
mid := len(arr) / 2
ch1, ch2 := make(chan []int), make(chan []int)
go mergesort(arr[:mid], ch1)
go mergesort(arr[mid:], ch2)
ch <- merge(<-ch1, <-ch2)
}
func merge(a1 []int, a2 []int)([]int){
// 同上,此略
}
func main() {
arr := []int{}
rand.Seed(time.Now().UnixNano())
arr = rand.Perm(100)
fmt.Println("unsorted array: ", arr)
ch := make(chan []int, 0)
// 這邊忘記開一個 goroutine 結果導致 deadlock XD
go mergesort(arr, ch)
newarr := <-ch
fmt.Println("sorted array: ", newarr)
}